/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tablero;

import com.codethesis.pgnparse.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;

/**
 *
 * @author manuelzc
 */
public class ManejoPGN {
    
    private ManejoBD manejoBD;

    public void cargarPGN(File archivo) throws IOException, PGNParseException, NullPointerException, MalformedMoveException {

        manejoBD = new ManejoBD();
        manejoBD.conectarBD();
        String ficha, pos_Inicial,pos_Final,coment;
        int numeroPartidaActual=0;
        PGNSource fuentePgn = new PGNSource(archivo);
        Iterator<PGNGame> iteradorJuego = fuentePgn.listGames().iterator();
            
        while (iteradorJuego.hasNext()) {
long startTime = System.currentTimeMillis();
            HashMap hashPartida = new HashMap();
            ArrayList<HashMap> listaMovimientos=new ArrayList();
            PGNGame juego = iteradorJuego.next();
            Iterator<String> iteradorEtiquetas = juego.getTagKeysIterator();

            while (iteradorEtiquetas.hasNext()) {
                String etiqueta = iteradorEtiquetas.next();
                if (esOmitida(etiqueta)) {
                if (etiqueta.equals(Constantes.ETIQUETA_FECHA) || etiqueta.equals(Constantes.ETIQUETA_RONDA)) {
                    String fecha = juego.getTag(etiqueta);
                    if (fecha.contains("?")) {
                        fecha = fecha.replaceAll("\\?", "0");
                    } else if (fecha.contains("\\.")) {
                        fecha = fecha.replaceAll("\\.", "-");
                    }
                    hashPartida.put(etiqueta, fecha);
                } else if(etiqueta.equals(Constantes.ETIQUETA_JUGADOR_BLANCO_ELO)& juego.getTag(etiqueta).equals("")) {
                    hashPartida.put(etiqueta, "0");
                    }
                else if(etiqueta.equals(Constantes.ETIQUETA_JUGADOR_NEGRO_ELO)& juego.getTag(etiqueta).equals("")) {
                    hashPartida.put(etiqueta, "0");
                    }
                else{
                    hashPartida.put(etiqueta, juego.getTag(etiqueta));
                }
                }
            }
            numeroPartidaActual=manejoBD.agregaPartida(hashPartida);
            hashPartida=null;
            
            if(numeroPartidaActual==0)
                continue;


            Iterator<PGNMove> iteradorMovimientos = juego.getMovesIterator();

            int numeroMovimiento = 1;
            while (iteradorMovimientos.hasNext()) {
                HashMap hashMovimiento=new HashMap();
                PGNMove movimiento = iteradorMovimientos.next();
                ficha = movimiento.getPiece();
                pos_Inicial = movimiento.getFromSquare();
                coment = movimiento.getComment();
                if (movimiento.isEndGameMarked()) {
                    break;
                } else if (movimiento.isKingSideCastle()) {
                 pos_Final = "O-O";
                 } else if (movimiento.isQueenSideCastle()) {
                 pos_Final = "O-0-0";
                 }  else {
                    pos_Final = movimiento.getToSquare();
                }
                hashMovimiento.put(Constantes.ID_PARTIDA, numeroPartidaActual);
                hashMovimiento.put(Constantes.ID_MOVIMIENTO, numeroMovimiento);
                hashMovimiento.put(Constantes.FICHA, ficha);
                hashMovimiento.put(Constantes.POS_INICIAL, pos_Inicial);
                hashMovimiento.put(Constantes.POS_FINAL, pos_Final);
                hashMovimiento.put(Constantes.COMENTARIO, coment);
                listaMovimientos.add(hashMovimiento);
                numeroMovimiento++;
                hashMovimiento=null;
            }
            manejoBD.agregaMovimiento(listaMovimientos);
            listaMovimientos=null;
                    long finishTime = System.currentTimeMillis();

System.out.println("That took: "+(finishTime-startTime)+ " ms");
        }
    }

    private boolean esOmitida(String etiqueta) {
        if(Arrays.asList(Constantes.ETIQUETAS_VALIDAS).contains(etiqueta)) {
            return true;
        }
        else {
            return false;
        }
}
}
